﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections;

namespace System.Windows.Forms;

/// <summary>
///  This is a read only collection of Forms exposed as a static property of the
///  Application class. This is used to store all the currently loaded forms in an app.
/// </summary>
public class FormCollection : ReadOnlyCollectionBase
{
    internal static object CollectionSyncRoot { get; } = new();

    /// <summary>
    ///  Changes when a new form is added.
    /// </summary>
    internal int AddVersion { get; private set; }

    /// <summary>
    ///  Gets a form specified by name, if present, else returns null. If there are multiple
    ///  forms with matching names, the first form found is returned.
    /// </summary>
    public virtual Form? this[string? name]
    {
        get
        {
            if (name is not null)
            {
                lock (CollectionSyncRoot)
                {
                    foreach (Form form in InnerList)
                    {
                        if (string.Equals(form.Name, name, StringComparison.OrdinalIgnoreCase))
                        {
                            return form;
                        }
                    }
                }
            }

            return null;
        }
    }

    /// <summary>
    ///  Gets a form specified by index.
    /// </summary>
    public virtual Form? this[int index]
    {
        get
        {
            Form? f = null;

            lock (CollectionSyncRoot)
            {
                f = (Form?)InnerList[index];
            }

            return f;
        }
    }

    /// <summary>
    ///  Used internally to add a Form to the FormCollection
    /// </summary>
    internal void Add(Form form)
    {
        lock (CollectionSyncRoot)
        {
            InnerList.Add(form);
            AddVersion++;
        }
    }

    /// <summary>
    ///  Used internally to check if a Form is in the FormCollection
    /// </summary>
    internal bool Contains(Form form)
    {
        bool inCollection = false;
        lock (CollectionSyncRoot)
        {
            inCollection = InnerList.Contains(form);
        }

        return inCollection;
    }

    /// <summary>
    ///  Used internally to remove a Form from the FormCollection
    /// </summary>
    internal void Remove(Form form)
    {
        lock (CollectionSyncRoot)
        {
            InnerList.Remove(form);
        }
    }

    /// <summary>
    ///  Used internally to remove a Form from the FormCollection
    /// </summary>
    internal void RemoveAt(int index)
    {
        lock (CollectionSyncRoot)
        {
            InnerList.RemoveAt(index);
        }
    }
}
